/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package funcionesDeMutacion;

import cromosomas.Arbol;
import cromosomas.CromosomaRuta;
import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncMutacion;
import util.Aleatorio;

/**
 *
 * @author Paco Torres
 */
public class Terminal implements FuncMutacion{
    public void mutar(Cromosoma cr){
        CromosomaRuta crg = (CromosomaRuta) cr;
        /*
         Generamos un subarbol hijo terminal aleatoriamente
         
         */
        Arbol a = new Arbol(null,Arbol.Tipo.SIC, 1, 0);;
        double p2=(double)Aleatorio.getDoubleAleatorio();
        int poperando = (int) Math.floor(p2 *4);
                    switch(poperando){
                        case 0: a.setTipo(Arbol.Tipo.AVANZA);break;
                        case 1: a.setTipo(Arbol.Tipo.GIRA_IZQUIERDA);break;
                        case 2: a.setTipo(Arbol.Tipo.GIRA_DERECHA);break;
                        case 3: a.setTipo(Arbol.Tipo.SIC);break;
                        default: a.setTipo(Arbol.Tipo.SIC);break;
                        
                    }
        /*
          buscamos un terminal y lo reemplazamos por el subarbol a             
        */
        double p3=(double)Aleatorio.getDoubleAleatorio();
        int posi = (int) Math.floor(p3 *crg.getMaximoNodos());            
        Arbol ay =crg.getGenotipo().setSubArbolInitTerminal(false,posi,crg.getGenotipo().getNum_nodos(),a);
        crg.setGenotipo(ay);
        crg.getGenotipo().actualizarNumeroNodos();            
        
    }
}
